# 单个* 类似按位置传递  的表示任意个参数
# ** 类似一个按关键字传递  得到是一个字典

def coffee_name(*coffee):
    print("my love coffee:")
    for item in coffee:
        print(item,end=" ")
    print()
    
# 调用时不用加*
coffee_name('lanshan')
coffee_name('lanshan','natie')


def func(**sign):
    print()
    for key,value in sign.items():
        print(key,' writted by  ',value)
    #for item in sign.items():
    #   print(item[0])


func(红楼梦='曹雪芹',水浒传='施耐庵')
sign_list = ['红楼梦','水浒传','西游记','三国演义']
author_list=['曹雪芹','施耐庵','吴承恩','罗贯中']
sign_author_dict = dict(zip(sign_list,author_list))
# 调用时必须用加**
func(**sign_author_dict)

# * 会把后面的参数组合成一个元组，供函数内调用
def calc(*numbers):
    sum =0
    for n in numbers:
        sum=sum+n*n 
    print(sum)
    
num1=(1,2,3,4)
num2=(5,2,3,4)
# 调用时加*  将元组内元素一个一个传递到函数里面
# calc(num1,num2)  #err
calc(num1,num2)


'''
####################Example######################
# 在函数调用时，* 会以单个元素的形式解包一个元组，使其成为独立的位置参数
# 在函数调用时，** 会以键/值对的形式解包一个字典，使其成为独立的关键字参数
#
# 在函数调用时 * 和 ** 
def func(a,b,c,d):
    print('a:{},b:{},c:{},d:{}'.format(a,b,c,d))

a = (1,2,3,4)
#func(a) #error
func(*a) # * 有解包的意思

# * 会把后面的参数组合成一个元组，供函数内调用
def calc(*numbers):
    sum =0
    for n in numbers:
        sum=sum+n*n 
    print(sum)
    
num1=(1,2,3,4)
num2=(5,2,3,4)
# 调用时加*  将元组内元素一个一个传递到函数里面
# calc(num1,num2)  #err
calc(*num1,*num2)


# 如果已经存在一个dict,在它前面加** ,函数会把dict在所有的键值对转换为关键字参数传进去

def person(name,age,**kw):
    print('name:',name,'age:',age,'other:',kw)

extra = {'city':'beijing','job':'Engineer'}
person('lilei', 18,**extra)
'''